package com.clip.util.mail;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;


/**
 * 不带附件
 * */
public class SimpleMailSender {

	public static boolean checkEmail(String mail){   

	    String regex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";   

	    Pattern   p   =   Pattern.compile(regex);   

	    Matcher   m   =   p.matcher(mail);   

	    return m.find();   

	}  
	/**
	 * 以文本格式发送邮件
	 * @param mailInfo 待发送邮件的信息
	 **/
	public static boolean sendTextMail(MailSenderInfo mailInfo){
		// 判断是否需要身份验证
		MyAuthenticator authenticator = null;
		if(mailInfo.isValidate()){
			// 需要验证时，创建一个密码验证器
			authenticator = new MyAuthenticator(mailInfo.getUsername(),
					mailInfo.getPassword());
		}
		//根据邮件会话属性和密码验证器构造一个发送邮件的Session
		Session sendMailSession = Session.getInstance(mailInfo.getProperties(), authenticator);
		try{
		//根据Session创建一个邮件消息
		Message mailMessage = new MimeMessage(sendMailSession);
		//创建邮件发送者的地址
		Address from = new InternetAddress(mailInfo.getFromAddress());
		//设置邮件消息的发送者
		mailMessage.setFrom(from);
		//创建邮件接收者，并设置到邮件消息中
		Address to = new InternetAddress(mailInfo.getToAddress());
		mailMessage.setRecipient(Message.RecipientType.TO,to);
		mailMessage.setSubject(mailInfo.getSubject());//设置邮件消息的主题
		mailMessage.setSentDate(new Date());//时间
		//设置消息的主要内容
		String mailContent = mailInfo.getContent();
		mailMessage.setText(mailContent);
		//System.out.println("开始发送...");
		Transport.send(mailMessage);
		return true;
		}catch(MessagingException ex){
			System.out.println("Fail!");
			ex.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 以HTML格式发送邮件
	 * @param mailInfo
	 **/
	public static boolean sendHtmlMail(MailSenderInfo mailInfo){
		// 判断是否需要身份验证
		MyAuthenticator authenticator = null;
		if(mailInfo.isValidate()){
			// 需要验证时，创建一个密码验证器
			authenticator = new MyAuthenticator(mailInfo.getUsername(),
					mailInfo.getPassword());
		}
		//根据邮件会话属性和密码验证器构造一个发送邮件的Session
		Session sendMailSession = Session.getInstance(mailInfo.getProperties(), authenticator);
		
		try{
			//根据Session创建一个邮件消息
			Message mailMessage = new MimeMessage(sendMailSession);
			//创建邮件发送者的地址
			Address from = new InternetAddress(mailInfo.getFromAddress(),MimeUtility.encodeText("档期"));
			mailMessage.setFrom(from);
			Address to = new InternetAddress(mailInfo.getToAddress());
			mailMessage.setRecipient(Message.RecipientType.TO, to);//接收者类型为TO
			mailMessage.setSubject(mailInfo.getSubject());
			mailMessage.setSentDate(new Date());
			
			//如下是HTML格式与文本格式的区别
			//MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
			Multipart mainPart = new MimeMultipart();
			BodyPart html = new MimeBodyPart();//创建一个包含Html内容的MimeBodyPart
			//设置Html内容
			html.setContent(mailInfo.getContent(), "text/html; charset=UTF-8");
			mainPart.addBodyPart(html);
			mailMessage.setContent(mainPart);//Multipart对象设置为邮件内容
			
			//System.out.println("开始发送...");
			Transport trans=sendMailSession.getTransport(); 
			Transport.send(mailMessage);
			trans.close();
			sendMailSession=null;
			return true;
		}catch(MessagingException ex){
			ex.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 
	 * @param mailContent 邮件内容
	 * @return
	 */
	public static boolean send(String mailContent,String userEmail){
		MailSenderInfo mailInfo = new MailSenderInfo();
		mailInfo.setMailServerHost(Env.getInstance().getProperty("MailServerHost"));//smtp服务器 地址
		mailInfo.setMailServerPort(Env.getInstance().getProperty("MailServerPort"));//端口号（默认25）
		//mailInfo.setValidate(true);
		if(Env.getInstance().getProperty("IsValidate").equals("false"))//是否需要身份验证（默认 是）
			mailInfo.setValidate(false);
		else
			mailInfo.setValidate(true);
		mailInfo.setUsername(Env.getInstance().getProperty("Username"));//发件人账号
		mailInfo.setPassword(Env.getInstance().getProperty("Password"));//发件人密码
		mailInfo.setFromAddress(Env.getInstance().getProperty("FromAddress"));//发件人地址
		mailInfo.setToAddress(userEmail);//收件人地址(由参数传递)  需要读取用户邮件地址(尚未动态)
		
		mailInfo.setSubject("您的行方向");//标题(由参数传递)
		mailInfo.setContent(mailContent);//内容(由参数传递)
		
		//if(SimpleMailSender.sendTextMail(mailInfo))
		if(SimpleMailSender.sendHtmlMail(mailInfo)){
			System.out.println("成功!");
			return true;
		}else{
			System.out.println("fail!");
			return false;
		}
	}
	
	public static boolean send(String mailContent,String subject,String userEmail){
		MailSenderInfo mailInfo = new MailSenderInfo();
		mailInfo.setMailServerHost(Env.getInstance().getProperty("MailServerHost"));//smtp服务器 地址
		mailInfo.setMailServerPort(Env.getInstance().getProperty("MailServerPort"));//端口号（默认25）
		//mailInfo.setValidate(true);
		if(Env.getInstance().getProperty("IsValidate").equals("false"))//是否需要身份验证（默认 是）
			mailInfo.setValidate(false);
		else
			mailInfo.setValidate(true);
		mailInfo.setUsername(Env.getInstance().getProperty("Username"));//发件人账号
		mailInfo.setPassword(Env.getInstance().getProperty("Password"));//发件人密码
		mailInfo.setFromAddress(Env.getInstance().getProperty("FromAddress"));//发件人地址
		mailInfo.setToAddress(userEmail);//收件人地址(由参数传递)  需要读取用户邮件地址(尚未动态)
		
		mailInfo.setSubject(subject);//标题(由参数传递)
		mailInfo.setContent(mailContent);//内容(由参数传递)
		Properties props=new Properties();  //创建系统属性对象
		//if(SimpleMailSender.sendTextMail(mailInfo))
		if(SimpleMailSender.sendHtmlMail(mailInfo)){
			//System.out.println("成功!");
			return true;
		}else{
			System.out.println("fail!");
			return false;
		}
	}
	
	public static void main(String[]args) throws FileNotFoundException{
		File file=new File(ClassLoader.getSystemResource("firstusers.properties").getPath());
		FileInputStream in = new FileInputStream(file);
		InputStreamReader isr=new InputStreamReader(in);
		BufferedReader br=new BufferedReader(isr);
		try {
			while(true){
				String str=br.readLine();
				if(str==null)
					break;
				if(str.lastIndexOf("*")==str.length()-1)
					continue;
				String[] strL=str.split("=");
				SimpleMailSender.send(generateMailContent(strL[0]), "邀请上海车网老用户回家",strL[1]);
			}
		} catch (IOException e) {
			if(br!=null){
				try {
					br.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			
			// TODO Auto-generated catch block
		}finally{
			if(br!=null){
				try {
					br.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
	}
	
	private static String generateMailContent(String name){
		StringBuffer sb=new StringBuffer();
		sb.append("<DIV><FONT size=2>尊敬的上海车网老用户<STRONG>");
		sb.append(name);
		sb.append("</STRONG>：</FONT></DIV>");
		sb.append("<DIV>&nbsp;</DIV><DIV><FONT size=2>您好!<BR>由于一些技术原因，上海车网论坛已经关闭了相当长一段时间。在这期间，给您使用论坛带来的不便，我们深感抱歉。<BR>目前，新上海车网论坛将计划重新开放，为了感谢您过去对上海车网的一贯支持和关心，我们也将特别为您在新的车网论坛注册了新帐号。</FONT></DIV><DIV>&nbsp;</DIV><DIV><FONT size=2>新上海车网论坛的具体使用信息如下：</FONT></DIV><DIV>&nbsp;</DIV><DIV><FONT size=2>新论坛的URL: <A href='http://www.myxing.cc/mybbs/'>http://www.myxing.cc/mybbs/</A></FONT></DIV><DIV>&nbsp;</DIV>");
		sb.append("<DIV><FONT size=2>您的用户名与以前上海车网的用户名相同，为：<STRONG>");
		sb.append(name);
		sb.append("</STRONG>&nbsp; 默认密码为：888888</FONT></DIV><DIV>&nbsp;</DIV><FONT size=2><DIV><BR>期待您再次加入我们的论坛!<DIV>&nbsp;</DIV><DIV>&nbsp;</DIV><DIV>&nbsp;</DIV><DIV>上海车网&amp;行方向网</DIV><DIV>&nbsp;</DIV><DIV>2010.2</DIV></FONT><DIV>&nbsp;</DIV>");
		return sb.toString();
	}
}
